home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Ham Radio 2000 #2
/
Ham Radio 2000 - Volume 2.iso
/
HAMV2
/
TCP_IP
/
TNOS230S
/
NVRAM.C
< prev
next >
Wrap
C/C++ Source or Header
|
1996-09-03
|
6KB
|
387 lines
/* Non-Volatile Ram user commands
* Copyright 1993 Brian A. Lantz, KO4KS
*/
#include "global.h"
#include "commands.h"
#include "mbuf.h"
#include "internet.h"
#include "timer.h"
#include "netuser.h"
#include "iface.h"
#include "session.h"
#include "ip.h"
#if !defined(_lint)
static char rcsid[] OPTIONAL = "$Id: nvram.c,v 1.10 1996/09/04 01:34:13 root Exp root $";
#endif
#define old
extern uint32 Ip_addr;
extern char Mycall[];
#ifdef nope
static int doipadd (int argc,char *argv[],void *p);
#endif
static int doread (int argc,char *argv[],void *p);
static int dowrite (int argc,char *argv[],void *p);
void PutNV (int value);
int readit (int address, int single);
int writeit (int address, int value);
static struct cmds nvcmds[] = {
#ifdef nope
"ipaddress", doipaddr, 0, 0, NULLCHAR,
#endif
"read", doread, 0, 0, NULLCHAR,
#ifndef old
"write", dowrite, 0, 0, NULLCHAR,
#endif
NULLCHAR,
};
int
donv(argc,argv,p)
int argc;
char *argv[];
void *p;
{
return subcmd(nvcmds,argc,argv,p);
}
#ifdef nope
static int
doipaddr(argc,argv,p)
int argc;
char *argv[];
void *p;
{
int32 n;
if(argc < 2) {
tprintf("%s\n",inet_ntoa(Ip_addr));
} else if((n = resolve(argv[1])) == 0){
tprintf(Badhost,argv[1]);
return 1;
} else
Ip_addr = n;
return 0;
}
#endif
static int
doread(argc,argv,p)
int argc;
char *argv[];
void *p;
{
#ifdef old
char *n = 0x3f8;
#endif
int c;
char buf[8], *newargv[3];
#ifdef old
c = *n;
#else
if ((c = readit (0, 1)) == -1) {
tprintf ("NV Read Error\x07\n");
return 0;
}
#endif
Ip_addr += (c << 8);
sprintf (buf, "unit%-.2d", c);
setcall(Mycall,buf);
newargv[1] = buf;
newargv[0] = newargv[2] = NULLCHAR;
dohostname (2, newargv, (void *) 0);
tprintf ("NV Ram Read\n");
return 0;
}
#ifndef old
static int
dowrite(argc,argv,p)
int argc;
char *argv[];
void *p;
{
int c;
/* takes unit # from Ip_addr, for now */
c = ((Ip_addr >> 8) & 0x0000ff);
if (writeit (0, c))
tprintf ("NV Ram Write Error\x07\n");
else
tprintf ("NV Ram Write Complete\n");
return 0;
}
#asm
Base equ $700000
PACNT equ Base+$81e
PADDR equ Base+$820
PADAT equ Base+$822
PBCNT equ Base+$824
PBDDR equ Base+$826
PBDAT equ Base+$828
Wait: nop
nop
nop
dbra d0,Wait
rts
GetNVAck:
bclr #0,PBDDR+1 set it for input
move.l #20,d0
bsr Wait
bsr CLKhi
move.l #20,d0
bsr Wait
move.b PBDAT+1,d1
bset #0,PBDDR+1 set it for output
move.l #20,d0
bsr Wait
bsr CLKlo
btst #0,d1
bne GetAk1
#ifdef DIAG
lea.l ACK(pc),a0
move.l a0,d0
bsr puts
#endif
clr.l d0
rts
GetAk1
#ifdef DIAG
lea.l NOACK(pc),a0
move.l a0,d0
bsr puts
#endif
move.l #-1,d0
rts
DATAlo: bclr #0,PBDAT+1
move.l #20,d0
bra Wait
DATAhi: bset #0,PBDAT+1
move.l #20,d0
bra Wait
CLKlo: bclr #4,PADAT
move.l #20,d0
bra Wait
CLKhi: bset #4,PADAT
move.l #20,d0
bra Wait
#endasm
start ()
{
#ifdef DIAG
puts ("Start bit being sent");
#endif
DATAhi();
CLKhi();
DATAlo();
CLKlo();
#ifdef DIAG
puts ("Complete!");
#endif
}
stop ()
{
#ifdef DIAG
puts ("Stop bit being sent");
#endif
DATAlo();
CLKhi();
DATAhi();
CLKlo();
#ifdef DIAG
puts ("Complete!\n");
#endif
}
clockbit ()
{
CLKhi();
Wait (20);
CLKlo();
}
zero ()
{
DATAlo();
#ifdef DIAG
putchar ('0');
#endif
clockbit();
}
one ()
{
DATAhi();
#ifdef DIAG
putchar ('1');
#endif
clockbit();
}
void
PutNV (value)
int value;
{
int bitmask = 0x80, count;
for (count = 0; count < 8; count++) {
if (value & bitmask)
one();
else
zero();
bitmask >>= 1;
}
}
int
getbit()
{
#asm
move.b PBDAT+1,d1
and.b #$fe,d1
#ifdef nope
move.l #20,d0
bsr Wait
#endif
move.l d1,d0
#endasm
}
int
GetNV ()
{
int bits, count;
int value = 0;
@ bclr #0,PBDDR+1 /* set it for input */
Wait(20);
for (count = 0; count < 8; count++) {
CLKhi();
value >>= 1;
/* Wait (20); */
bits = getbit();
if (bits) {
#ifdef DIAG
putchar ('1');
#endif
value |= 0x80;
} else {
#ifdef DIAG
putchar ('0');
#endif
}
CLKlo();
/* Wait (20); */
}
@ bset #0,PBDDR+1 /* set it for output */
putchar ('\n');
return (value);
}
int
readit (address, single)
int address, single;
{
int value;
start();
PutNV (0xa0);
if (GetNVAck () == -1)
return (-1);
PutNV (address);
if (GetNVAck () == -1)
return (-1);
start();
PutNV (0xa1);
if (GetNVAck () == -1)
return (-1);
value = GetNV ();
if (single)
stop();
#ifdef DIAG
printf ("Value of NV Ram at that location: %02x\n", value);
#endif
return (value);
}
int
writeit (address, value)
int address;
int value;
{
start();
PutNV (0xa0);
if (GetNVAck () == -1)
return (-1);
PutNV (address);
if (GetNVAck () == -1)
return (-1);
PutNV (value);
if (GetNVAck () == -1)
return (-1);
stop();
return (0);
}
#asm
EnNV bclr #4,PACNT make sure PA12 is enabled
bset #4,PADDR set it for output
bclr #0,PBCNT+1 make sure that PB0 is enabled
bset #0,PBDDR+1 set it for output
move.l #20,d0
bra Wait
#endasm
void
AckIt()
{
DATAlo ();
CLKhi ();
CLKlo ();
}
int
readall (buf)
unsigned char *buf;
{
int c;
c = readit (0, 0);
if (c == -1)
return (-1);
buf[0] = c;
for (c = 1; c < 256; c++) {
AckIt ();
buf[c] = GetNV();
}
stop ();
return (0);
}
#endif